using System;
using System.Collections.Generic;
using System.Data;

using PMServiceDesk.DataType;
using PMServiceDesk.Utils.ManejoDatos;

namespace PMServiceDesk.DataAccess
{
    public class RecursoData
    {
        #region Variables

        private string _select;
        private string _join;
        private string _where;
        private int _totalRegistros = 0;

        private Dictionary<string, object> _parametrosConsulta;

        #endregion

        #region Propiedades

        protected string Where
        {
            get
            {
                if (_where == "") return "";

                return "WHERE " + _where.Substring(3);
            }
        }

        #endregion

        #region Constructores

        public RecursoData()
        {
            this._limpiarConsulta();
        }

        #endregion

        #region Metodos

        private void _limpiarConsulta()
        {
            _select = "";
            _join = "";
            _where = "";
            _parametrosConsulta = new Dictionary<string, object>();
        }

        private DataUtil _consultaDataReader(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            DataUtil data = null;

            if(paginaActual==0)
                data = new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, _select + _join + this.Where + orderBy,_parametrosConsulta);
            else
                data = DataReader.ReturnPagingReader(TypeDataBase.PMServiceDesk, _select, _join, this.Where, this._parametrosConsulta, paginaActual, cantidadMostrar, orderBy, ref _totalRegistros);

            this._limpiarConsulta();

            return data;
        }

        public void Grabar(RecursoType recurso)
        {
            using (DataUtil d = this._grabar())
            {
                d.AddParameter("@ID", (recurso.Id == null ? "0" : recurso.Id));
                d.AddParameter("@PROYECTOID", recurso.ProyectoId);
                d.AddParameter("@TIPORECURSOID", recurso.TipoRecursoId);
                d.AddParameter("@TIPOCOSTOID", recurso.TipoCostoId);
                d.AddParameter("@TIPODOCUMENTOIDENTIDADID", (recurso.TipoDocumentoIdentidadId == "") ? null : recurso.TipoDocumentoIdentidadId );
                d.AddParameter("@CALENDARIOID", recurso.CalendarioId);
                d.AddParameter("@ESTADOID", recurso.EstadoId);
                d.AddParameter("@NOMBRE", recurso.Nombre);
                d.AddParameter("@ABREVIATURA", recurso.Abreviatura);
                d.AddParameter("@DOCUMENTOIDENTIDAD", recurso.DocumentoIdentidad);
                d.AddParameter("@COSTO", recurso.Costo);

                recurso.Id = d.ExecuteScalar(true).ToString();
            }
        }

        public RecursoType Cargar()
        {
            List<RecursoType> l = this.CargarLista();

            if (l.Count == 0) return null;

            return l[0];
        }

        public List<RecursoType> CargarLista()
        {
            List<RecursoType> l = new List<RecursoType>();

            using (DataUtil d = this._consultaCargar())
                using (IDataReader r = d.ExecuteReader())
                {
                    RecursoType o = null;

                    while (r.Read())
                    {
                        o = new RecursoType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.ProyectoId = r.GetValue(d.GetOrdinalReader("PROYECTOID")).ToString();
                        o.TipoRecursoId = r.GetValue(d.GetOrdinalReader("TIPORECURSOID")).ToString();
                        o.TipoRecurso = r.GetValue(d.GetOrdinalReader("TIPORECURSO")).ToString();
                        o.TipoCostoId = r.GetValue(d.GetOrdinalReader("TIPOCOSTOID")).ToString();
                        o.TipoCosto = r.GetValue(d.GetOrdinalReader("TIPOCOSTO")).ToString();
                        o.TipoDocumentoIdentidadId = r.GetValue(d.GetOrdinalReader("TIPODOCUMENTOIDENTIDADID")).ToString();
                        o.TipoDocumentoIdentidad = r.GetValue(d.GetOrdinalReader("TIPODOCUMENTOIDENTIDAD")).ToString();
                        o.CalendarioId = r.GetValue(d.GetOrdinalReader("CALENDARIOID")).ToString();
                        o.Calendario = r.GetValue(d.GetOrdinalReader("CALENDARIO")).ToString();
                        o.EstadoId = r.GetValue(d.GetOrdinalReader("ESTADOID")).ToString();
                        o.Estado = r.GetValue(d.GetOrdinalReader("ESTADO")).ToString();
                        o.Nombre = r.GetValue(d.GetOrdinalReader("NOMBRE")).ToString();
                        o.Abreviatura = r.GetValue(d.GetOrdinalReader("ABREVIATURA")).ToString();
                        o.DocumentoIdentidad = r.GetValue(d.GetOrdinalReader("DOCUMENTOIDENTIDAD")).ToString();
                        o.Costo = Convert.ToDecimal(r.GetValue(d.GetOrdinalReader("COSTO")));

                        l.Add(o);
                    }
                }

            return l;
        }

        public List<RecursoType> CargarListaVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            List<RecursoType> l = new List<RecursoType>();

            using (DataUtil d = this._consultaCargarVista(paginaActual, cantidadMostrar,orderBy))
                using (IDataReader r = d.ExecuteReader())
                {
                    RecursoType o = null;

                    while (r.Read())
                    {
                        o = new RecursoType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.ProyectoId = r.GetValue(d.GetOrdinalReader("PROYECTOID")).ToString();
                        o.TipoRecursoId = r.GetValue(d.GetOrdinalReader("TIPORECURSOID")).ToString();
                        o.TipoRecurso = r.GetValue(d.GetOrdinalReader("TIPORECURSO")).ToString();
                        o.TipoCostoId = r.GetValue(d.GetOrdinalReader("TIPOCOSTOID")).ToString();
                        o.TipoCosto = r.GetValue(d.GetOrdinalReader("TIPOCOSTO")).ToString();
                        o.TipoDocumentoIdentidadId = r.GetValue(d.GetOrdinalReader("TIPODOCUMENTOIDENTIDADID")).ToString();
                        o.TipoDocumentoIdentidad = r.GetValue(d.GetOrdinalReader("TIPODOCUMENTOIDENTIDAD")).ToString();
                        o.CalendarioId = r.GetValue(d.GetOrdinalReader("CALENDARIOID")).ToString();
                        o.Calendario = r.GetValue(d.GetOrdinalReader("CALENDARIO")).ToString();
                        o.EstadoId = r.GetValue(d.GetOrdinalReader("ESTADOID")).ToString();
                        o.Estado = r.GetValue(d.GetOrdinalReader("ESTADO")).ToString();
                        o.Nombre = r.GetValue(d.GetOrdinalReader("NOMBRE")).ToString();
                        o.Abreviatura = r.GetValue(d.GetOrdinalReader("ABREVIATURA")).ToString();
                        o.DocumentoIdentidad = r.GetValue(d.GetOrdinalReader("DOCUMENTOIDENTIDAD")).ToString();
                        o.Costo = Convert.ToDecimal(r.GetValue(d.GetOrdinalReader("COSTO")));
                        o.CostoMoneda = r.GetValue(d.GetOrdinalReader("SIMBOLOMONEDA")).ToString() +  " " +  ConvertFormat.Decimal_To_Char(o.Costo);
                        l.Add(o);
                    }
                }

            if (l.Count <= _totalRegistros) l.Capacity = _totalRegistros;

            return l;
        }

        #endregion

        #region SQL

        private DataUtil _grabar()
        {
            string sql = @"IF(NOT EXISTS(SELECT 1 FROM RECURSO WHERE ID=@ID)) 
                           BEGIN
                               INSERT INTO RECURSO
                               (
                                   PROYECTOID
                                  ,TIPORECURSOID
                                  ,TIPOCOSTOID
                                  ,TIPODOCUMENTOIDENTIDADID
                                  ,CALENDARIOID
                                  ,ESTADOID
                                  ,NOMBRE
                                  ,ABREVIATURA
                                  ,DOCUMENTOIDENTIDAD
                                  ,COSTO
                               )
                               VALUES
                               (
                                   @PROYECTOID
                                  ,@TIPORECURSOID
                                  ,@TIPOCOSTOID
                                  ,@TIPODOCUMENTOIDENTIDADID
                                  ,@CALENDARIOID
                                  ,@ESTADOID
                                  ,@NOMBRE
                                  ,@ABREVIATURA
                                  ,@DOCUMENTOIDENTIDAD
                                  ,@COSTO
                               )

                               SELECT @@IDENTITY
                           END
                           ELSE
                           BEGIN
                               UPDATE RECURSO SET
                               PROYECTOID=@PROYECTOID
                              ,TIPORECURSOID=@TIPORECURSOID
                              ,TIPOCOSTOID=@TIPOCOSTOID
                              ,TIPODOCUMENTOIDENTIDADID=@TIPODOCUMENTOIDENTIDADID
                              ,CALENDARIOID=@CALENDARIOID
                              ,ESTADOID=@ESTADOID
                              ,NOMBRE=@NOMBRE
                              ,ABREVIATURA=@ABREVIATURA
                              ,DOCUMENTOIDENTIDAD=@DOCUMENTOIDENTIDAD
                              ,COSTO=@COSTO
                               WHERE ID=@ID

                               SELECT @ID
                           END";

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql);
        }

        private DataUtil _consultaCargar()
        {
            _select = @"SELECT
                        RE.ID										[ID]
                        ,RE.PROYECTOID								[PROYECTOID]
                        ,RE.TIPORECURSOID							[TIPORECURSOID]
                        ,TIPREC.NOMBRE								[TIPORECURSO]
                        ,RE.TIPOCOSTOID								[TIPOCOSTOID]
                        ,TIPCOS.NOMBRE								[TIPOCOSTO]
                        ,RE.TIPODOCUMENTOIDENTIDADID				[TIPODOCUMENTOIDENTIDADID]
                        ,TIPDOC.NOMBRE								[TIPODOCUMENTOIDENTIDAD]
                        ,RE.CALENDARIOID							[CALENDARIOID]
                        ,CAL.NOMBRE									[CALENDARIO]
                        ,RE.ESTADOID								[ESTADOID]
                        ,ESTREC.NOMBRE								[ESTADO]
                        ,RE.NOMBRE									[NOMBRE]
                        ,RE.ABREVIATURA								[ABREVIATURA]
                        ,RE.DOCUMENTOIDENTIDAD						[DOCUMENTOIDENTIDAD]
                        ,RE.COSTO									[COSTO]
                        ";

            _join = @"FROM DBO.RECURSO [RE] 
                    INNER JOIN CALENDARIO CAL ON RE.CALENDARIOID=CAL.ID
                    INNER JOIN ESTADO ESTREC ON RE.ESTADOID=ESTREC.ID
                    INNER JOIN PARAMETRO TIPREC ON RE.TIPORECURSOID=TIPREC.ID
                    INNER JOIN PARAMETRO TIPCOS ON RE.TIPOCOSTOID=TIPCOS.ID
                    LEFT JOIN PARAMETRO TIPDOC ON RE.TIPODOCUMENTOIDENTIDADID=TIPDOC.ID
                      ";

            return this._consultaDataReader();
        }

        private DataUtil _consultaCargarVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            _select = @"SELECT
                        RE.ID										[ID]
                        ,RE.PROYECTOID								[PROYECTOID]
                        ,RE.TIPORECURSOID							[TIPORECURSOID]
                        ,TIPREC.NOMBRE								[TIPORECURSO]
                        ,RE.TIPOCOSTOID								[TIPOCOSTOID]
                        ,TIPCOS.NOMBRE								[TIPOCOSTO]
                        ,RE.TIPODOCUMENTOIDENTIDADID				[TIPODOCUMENTOIDENTIDADID]
                        ,TIPDOC.NOMBRE								[TIPODOCUMENTOIDENTIDAD]
                        ,RE.CALENDARIOID							[CALENDARIOID]
                        ,CAL.NOMBRE									[CALENDARIO]
                        ,RE.ESTADOID								[ESTADOID]
                        ,ESTREC.NOMBRE								[ESTADO]
                        ,RE.NOMBRE									[NOMBRE]
                        ,RE.ABREVIATURA								[ABREVIATURA]
                        ,RE.DOCUMENTOIDENTIDAD						[DOCUMENTOIDENTIDAD]
                        ,RE.COSTO									[COSTO]
                        ,PROMON.ABREVIATURA             [SIMBOLOMONEDA]
                        ";

            _join = @"FROM DBO.RECURSO [RE] 
                    INNER JOIN PROYECTO PROY ON RE.PROYECTOID=PROY.ID
                    INNER JOIN CALENDARIO CAL ON RE.CALENDARIOID=CAL.ID
                    INNER JOIN ESTADO ESTREC ON RE.ESTADOID=ESTREC.ID
                    INNER JOIN PARAMETRO TIPREC ON RE.TIPORECURSOID=TIPREC.ID
                    INNER JOIN PARAMETRO TIPCOS ON RE.TIPOCOSTOID=TIPCOS.ID
                    INNER JOIN PARAMETRO PROMON ON PROY.MONEDAID=PROMON.ID
                    LEFT JOIN PARAMETRO TIPDOC ON RE.TIPODOCUMENTOIDENTIDADID=TIPDOC.ID
                      ";
            return this._consultaDataReader(paginaActual, cantidadMostrar, orderBy);
        }

        public void FiltrarPorId(string id)
        {
            _where += @"AND RE.ID=@ID
                                 ";

            _parametrosConsulta.Add("@ID", id);
        }
        public void FiltrarPorProyectoId(string proyectoId)
        {
            _where += @"AND RE.PROYECTOID=@PROYECTOID
                                 ";

            _parametrosConsulta.Add("@PROYECTOID", proyectoId);
        }
        public void FiltrarPorTipoDocumentoIdentidad(string tipoDocumentoIdentidadId)
        {
            _where += @"AND RE.TIPODOCUMENTOIDENTIDADID=@TIPODOCUMENTOIDENTIDADID
                                 ";

            _parametrosConsulta.Add("@TIPODOCUMENTOIDENTIDADID", tipoDocumentoIdentidadId);
        }
        public void FiltrarPorDocumentoIdentidad(string documentoIdentidad)
        {
            _where += @"AND RE.DOCUMENTOIDENTIDAD LIKE '%' +  @DOCUMENTOIDENTIDAD + '%'
                                 ";

            _parametrosConsulta.Add("@DOCUMENTOIDENTIDAD", documentoIdentidad);
        }
        public void FiltrarPorEstadoId(string estadoId)
        {
            _where += @"AND RE.ESTADOID=@ESTADOID
                                 ";

            _parametrosConsulta.Add("@ESTADOID", estadoId);
        }
        public void FiltrarPorTipoRecurso(string tipoRecursoId)
        {
            _where += @"AND RE.TIPORECURSOID=@TIPORECURSOID
                                 ";

            _parametrosConsulta.Add("@TIPORECURSOID", tipoRecursoId);
        }
        public void FiltrarPorCalendario(string calendarioId)
        {
            _where += @"AND RE.CALENDARIOID=@CALENDARIOID
                                 ";

            _parametrosConsulta.Add("@CALENDARIOID", calendarioId);
        }
        public void FiltrarPorNombre(string nombre)
        {
            _where += @"AND RE.NOMBRE LIKE '%' + @NOMBRE + '%'
                                 ";

            _parametrosConsulta.Add("@NOMBRE", nombre);
        }
        public void FiltrarPorAbreviatura(string abreviatura)
        {
            _where += @"AND RE.ABREVIATURA LIKE '%' + @ABREVIATURA + '%'
                                 ";

            _parametrosConsulta.Add("@ABREVIATURA", abreviatura);
        }

        #endregion
    }
}
